Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


sbapp/kivymd/effects/stiffscroll/stiffscroll.py f8b3e3760b831745cf10d97aeae64e9c00a136a9 (f8b3e376) Text, 7.12 KB

T8b949e"""
Effects/StiffScrollEffect
=========================

An Effect to be used with ScrollView to prevent scrolling beyond
the bounds, but politely.

A ScrollView constructed with StiffScrollEffect,
eg. ScrollView(effect_cls=StiffScrollEffect), will get harder to
scroll as you get nearer to its edges. You can scroll all the way to
the edge if you want to, but it will take more finger-movement than
usual.

Unlike DampedScrollEffect, it is impossible to overscroll with
StiffScrollEffect. That means you cannot push the contents of the
ScrollView far enough to see what's beneath them. This is appropriate
if the ScrollView contains, eg., a background image, like a desktop
wallpaper. Overscrolling may give the impression that there is some
reason to overscroll, even if just to take a peek beneath, and that
impression may be misleading.

StiffScrollEffect was written by Zachary Spector. His other stuff is at:
https://github.com/LogicalDash/
He can be reached, and possibly hired, at:
zacharyspector@gmail.com

"""

Tff7b72from T7ee787time Tff7b72import Te6edf3time

Tff7b72from T7ee787kivyT7ee787.T7ee787animation Tff7b72import Te6edf3AnimationTransition
Tff7b72from T7ee787kivyT7ee787.T7ee787effectsT7ee787.T7ee787kinetic Tff7b72import Te6edf3KineticEffect
Tff7b72from T7ee787kivyT7ee787.T7ee787properties Tff7b72import Te6edf3NumericPropertyTb4b4b4, Te6edf3ObjectProperty
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787widget Tff7b72import Te6edf3Widget


Tff7b72class T56d364StiffScrollEffectTb4b4b4(Te6edf3KineticEffectTb4b4b4)Tb4b4b4:
Te6edf3drag_threshold Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff20spTa5d6ff"Tb4b4b4)
T8b949e"""Minimum distance to travel before the movement is considered as a
drag.

:attr:`drag_threshold` is an :class:`~kivy.properties.NumericProperty`
and defaults to `'20sp'`.
"""

Tffa657min Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff0Tb4b4b4)
T8b949e"""Minimum boundary to stop the scrolling at.

:attr:`min` is an :class:`~kivy.properties.NumericProperty`
and defaults to `0`.
"""

Tffa657max Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff0Tb4b4b4)
T8b949e"""Maximum boundary to stop the scrolling at.

:attr:`max` is an :class:`~kivy.properties.NumericProperty`
and defaults to `0`.
"""

Te6edf3max_friction Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff1Tb4b4b4)
T8b949e"""How hard should it be to scroll, at the worst?

:attr:`max_friction` is an :class:`~kivy.properties.NumericProperty`
and defaults to `1`.
"""

Te6edf3body Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff0.7Tb4b4b4)
T8b949e"""Proportion of the range in which you can scroll unimpeded.

:attr:`body` is an :class:`~kivy.properties.NumericProperty`
and defaults to `0.7`.
"""

Te6edf3scroll Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff0.0Tb4b4b4)
T8b949e"""Computed value for scrolling

:attr:`scroll` is an :class:`~kivy.properties.NumericProperty`
and defaults to `0.0`.
"""

Te6edf3transition_min Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Te6edf3AnimationTransitionTff7b72.Td2a8ffin_cubicTb4b4b4)
T8b949e"""The AnimationTransition function to use when adjusting the friction
near the minimum end of the effect.

:attr:`transition_min` is an :class:`~kivy.properties.ObjectProperty`
and defaults to :class:`kivy.animation.AnimationTransition`.
"""

Te6edf3transition_max Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Te6edf3AnimationTransitionTff7b72.Td2a8ffin_cubicTb4b4b4)
T8b949e"""The AnimationTransition function to use when adjusting the friction
near the maximum end of the effect.

:attr:`transition_max` is an :class:`~kivy.properties.ObjectProperty`
and defaults to :class:`kivy.animation.AnimationTransition`.
"""

Te6edf3target_widget Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3allownoneTff7b72=Tff7b72TrueTb4b4b4, Te6edf3baseclassTff7b72=Te6edf3WidgetTb4b4b4)
T8b949e"""The widget to apply the effect to.

:attr:`target_widget` is an :class:`~kivy.properties.ObjectProperty`
and defaults to ``None``.
"""

Te6edf3displacement Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff0Tb4b4b4)
T8b949e"""The absolute distance moved in either direction.

:attr:`displacement` is an :class:`~kivy.properties.NumericProperty`
and defaults to `0`.
"""

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
T8b949e"""Set ``self.base_friction`` to the value of ``self.friction`` just
after instantiation, so that I can reset to that value later.
"""

Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbase_friction Tff7b72= Tff7b72selfTff7b72.Td2a8fffriction

Tff7b72def Td2a8ffupdate_velocityTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dtTb4b4b4)Tb4b4b4:
T8b949e"""Before actually updating my velocity, meddle with ``self.friction``
to make it appropriate to where I'm at, currently.
"""

Te6edf3hard_min Tff7b72= Tff7b72selfTff7b72.Td2a8ffmin
Te6edf3hard_max Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax
Tff7b72if Te6edf3hard_min Tff7b72> Te6edf3hard_maxTb4b4b4:
Te6edf3hard_minTb4b4b4, Te6edf3hard_max Tff7b72= Te6edf3hard_maxTb4b4b4, Te6edf3hard_min

Te6edf3margin Tff7b72= Tb4b4b4(T79c0ff1.0 Tff7b72- Tff7b72selfTff7b72.Td2a8ffbodyTb4b4b4) Tff7b72* Tb4b4b4(Te6edf3hard_max Tff7b72- Te6edf3hard_minTb4b4b4)
Te6edf3soft_min Tff7b72= Te6edf3hard_min Tff7b72+ Te6edf3margin
Te6edf3soft_max Tff7b72= Te6edf3hard_max Tff7b72- Te6edf3margin

Tff7b72if Tff7b72selfTff7b72.Td2a8ffvalue Tff7b72< Te6edf3soft_minTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3prop Tff7b72= Tb4b4b4(Te6edf3soft_min Tff7b72- Tff7b72selfTff7b72.Td2a8ffvalueTb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3soft_min Tff7b72- Te6edf3hard_minTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffriction Tff7b72= Tff7b72selfTff7b72.Td2a8ffbase_friction Tff7b72+ Tffa657absTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffmax_friction Tff7b72- Tff7b72selfTff7b72.Td2a8ffbase_friction
Tb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8fftransition_minTb4b4b4(Te6edf3propTb4b4b4)
Tff7b72except Tf85149ZeroDivisionErrorTb4b4b4:
Tff7b72pass
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffvalue Tff7b72> Te6edf3soft_maxTb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# normalize how far past soft_max I've gone as a
T8b949e# proportion of the distance between soft_max and hard_max
Te6edf3prop Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffvalue Tff7b72- Te6edf3soft_maxTb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3hard_max Tff7b72- Te6edf3soft_maxTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffriction Tff7b72= Tff7b72selfTff7b72.Td2a8ffbase_friction Tff7b72+ Tffa657absTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffmax_friction Tff7b72- Tff7b72selfTff7b72.Td2a8ffbase_friction
Tb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8fftransition_minTb4b4b4(Te6edf3propTb4b4b4)
Tff7b72except Tf85149ZeroDivisionErrorTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffriction Tff7b72= Tff7b72selfTff7b72.Td2a8ffbase_friction

Tff7b72return Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffupdate_velocityTb4b4b4(Te6edf3dtTb4b4b4)

Tff7b72def Td2a8ffon_valueTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
T8b949e"""Prevent moving beyond my bounds, and update ``self.scroll``"""

Tff7b72if Tff7b72selfTff7b72.Td2a8ffvalue Tff7b72> Tff7b72selfTff7b72.Td2a8ffminTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffvelocity Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffscroll Tff7b72= Tff7b72selfTff7b72.Td2a8ffmin
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffvalue Tff7b72< Tff7b72selfTff7b72.Td2a8ffmaxTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffvelocity Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffscroll Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffscroll Tff7b72= Tff7b72selfTff7b72.Td2a8ffvalue

Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valTb4b4b4, Te6edf3tTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Start movement with ``self.friction`` = ``self.base_friction``"""

Tff7b72selfTff7b72.Td2a8ffis_manual Tff7b72= Tff7b72True
Te6edf3t Tff7b72= Te6edf3t Tff7b72or Te6edf3timeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffvelocity Tff7b72= Tff7b72selfTff7b72.Td2a8ffdisplacement Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fffriction Tff7b72= Tff7b72selfTff7b72.Td2a8ffbase_friction
Tff7b72selfTff7b72.Td2a8ffhistory Tff7b72= Tb4b4b4[Tb4b4b4(Te6edf3tTb4b4b4, Te6edf3valTb4b4b4)Tb4b4b4]

Tff7b72def Td2a8ffupdateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valTb4b4b4, Te6edf3tTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Reduce the impact of whatever change has been made to me, in
proportion with my current friction.
"""

Te6edf3t Tff7b72= Te6edf3t Tff7b72or Te6edf3timeTb4b4b4(Tb4b4b4)
Te6edf3hard_min Tff7b72= Tff7b72selfTff7b72.Td2a8ffmin
Te6edf3hard_max Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax
Tff7b72if Te6edf3hard_min Tff7b72> Te6edf3hard_maxTb4b4b4:
Te6edf3hard_minTb4b4b4, Te6edf3hard_max Tff7b72= Te6edf3hard_maxTb4b4b4, Te6edf3hard_min

Te6edf3gamut Tff7b72= Te6edf3hard_max Tff7b72- Te6edf3hard_min
Te6edf3margin Tff7b72= Tb4b4b4(T79c0ff1.0 Tff7b72- Tff7b72selfTff7b72.Td2a8ffbodyTb4b4b4) Tff7b72* Te6edf3gamut
Te6edf3soft_min Tff7b72= Te6edf3hard_min Tff7b72+ Te6edf3margin
Te6edf3soft_max Tff7b72= Te6edf3hard_max Tff7b72- Te6edf3margin
Te6edf3distance Tff7b72= Te6edf3val Tff7b72- Tff7b72selfTff7b72.Td2a8ffhistoryTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3reach Tff7b72= Te6edf3distance Tff7b72+ Tff7b72selfTff7b72.Td2a8ffvalue

Tff7b72if Tb4b4b4(Te6edf3distance Tff7b72< T79c0ff0 Tff7b72and Te6edf3reach Tff7b72< Te6edf3soft_minTb4b4b4) Tff7b72or Tb4b4b4(
Te6edf3distance Tff7b72> T79c0ff0 Tff7b72and Te6edf3soft_max Tff7b72< Te6edf3reach
Tb4b4b4)Tb4b4b4:
Te6edf3distance Tff7b72-Tff7b72= Te6edf3distance Tff7b72* Tff7b72selfTff7b72.Td2a8fffriction
Tff7b72selfTff7b72.Td2a8ffapply_distanceTb4b4b4(Te6edf3distanceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhistoryTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3tTb4b4b4, Te6edf3valTb4b4b4)Tb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhistoryTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffmax_historyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhistoryTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplacement Tff7b72+Tff7b72= Tffa657absTb4b4b4(Te6edf3distanceTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftrigger_velocity_updateTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valTb4b4b4, Te6edf3tTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Work out whether I've been flung."""

Tff7b72selfTff7b72.Td2a8ffis_manual Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffdisplacement Tff7b72+Tff7b72= Tffa657absTb4b4b4(Te6edf3val Tff7b72- Tff7b72selfTff7b72.Td2a8ffhistoryTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplacement Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffdrag_thresholdTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffvelocity Tff7b72= T79c0ff0

Tff7b72return Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstopTb4b4b4(Te6edf3valTb4b4b4, Te6edf3tTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────